-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
feat: add type annotations to generated code #5008
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
gvwilson
wants to merge
11
commits into
main
Choose a base branch
from
type-annotations
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
693cd5e to
8da092c
Compare
1. Add `bin/get_size.py` so that `python bin/get_size.py plotly build`
reports the number of files and total size in bytes of the `plotly`
directory (where generated code is put) and the `build` directory
that is populated by `python setup.py build`.
1. Modify `codegen/__init__.py` and `./setup.py` so that
`python setup.py --reformat=false` disables reformatting.
1. Assign an empty string to the `data_docs` field of generated
validators. (This has a major impact because those docs are
duplicated many times.)
1. Alias name of base validator during import in
`codegen/validators.py`.
1. Remove the long list of CSS colors from help strings for color
properties.
1. Replace `super(Parent, self)` with `super()` in generated code.
1. Drop use of sys.version_info and TYPE_CHECKING. Removed the check
for Python < 3.7 using `sys.version_info` and as a backup checking
`typing.TYPE_CHECKING`; this saves a little space and also cleans
up the code.
1. Remove mention of Chart Studio and explicit enumeration of system
font names from plotly.js / plot-schema.json so that this text
isn't copied dozens of times into the plotly.py bundle.
1. Introduce `_init_provided()` for `BaseFigure` and `BasePlotlyType`
that calls a helper function `_initialize_provided()` to replace
repetitions of:
```
_v = arg.pop("something", None)
_v = something if something is not None else _v
if _v is not None:
self["something"] = _v
```
Original size of plotly/**/*.py: 42283582 bytes
Current size of plotly/**/*.py: 31931739 bytes
Change: -25%
1. Add `from __future__ import annotations` as the first line of
generated files so that modern Python type annotation syntax can
be used in older versions of Python.
1. Add `from typing import Any` and `from numpy.types import NDArray`
to all generated files rather than trying to figure out which
of these imports are needed on a file-by-file basis.
1. Rename `get_typing_type` in `codegen/datatypes.py` to
`get_python_type` to make purpose clearer.
1. Add additional optional parameter to `get_python_type` so that
`compound` and `compound_array` types in the schema are converted
to `None` rather than causing an exception.
1. Modify `codegen/datatypes.py` to add type annotations to constructor
parameters.
1. Modify `codegen/figure.py` to add `bool` type to one figure
constructor parameter.
FIXME: figure out what type should actually be returned for `compound`
and `compound_array`.
FIXME: figure out what types to use for other standard parameters of
figures generated by `codegen/figure.py`.
8da092c to
f949f65
Compare
1. Modify `commands.py` to run code generation. 1. Remove comments from generated code. 1. Replaced named arguments in constructors with positional arguments. 1. Regenerate all code. Notes: The generated code is reformatted once again: this slightly increases size but makes it more readable. There is one flaky test: `tests/test_plotly_utils/validators/test_colorscale_validator.py::test_acceptance_named[Inferno_r]` It fails when the entire test suite is run but does *not* fail when only `test_colorscale_validator.py` is run (using Python 3.11.9). | branch | format | bytes | %age | | -------- | ------- | -------- | ---- | | master | .whl | 14803768 | | | codegen2 | .whl | 12215667 | -18% | | master | .tar.gz | 8100014 | | | codegen2 | .tar.gz | 6114458 | -24% |
1. Update required version of `black` in `pyproject.toml` and `.circleci/config.yml`. 2. Update Python version identifiers in `tool.black` section of `pyproject.toml` to include `py311` and `py312`. 3. Modify invocation of `black` in `commands.py` to format with `py311`. 4. Regenerate and reformat code.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
feat: adding type annotations to some constructor parameters
Using
get_typing_typefromcodegen/datatypes.pyto add Python datatype to some constructor parameters.Notes:
Does not handle the
compounddatatype yet.get_typing_typeraises a
ValueErrorbecause it doesn't have a clause for thistype;
add_constructor_paramscatches this and simply doesn't adda type definition. Something between a third and half of all
constructor parameters suffer from this, so we need to figure out
what
compoundmeans and define a type for it. (SeeFIXMEinthe
codegendirectory.)Almost all parameters are nullable, so the type is defined as
(for example)
intbut the default value assigned isNone.Depends on feat: modifying code generation to reduce bundle size #4978.